/*
 * @Author: jiaze.li
 * @Date: 2024-01-09 16:07:18
 * @LastEditors: jiaze.li
 * @LastEditTime: 2024-09-27 10:34:11
 * @Description: socket 客户端封装
 * @MattersNeedingAttention: 
 * 
 */
#ifndef __TCP__CLIENT__
#define __TCP__CLIENT__

#include <netinet/in.h>

enum {
    TCP_CLIENT_E_OK = 0,
    TCP_CLIENT_E_TIMEOUT,
    TCP_CLIENT_E_SOCKET,
    TCP_CLIENT_E_SET_NON_BLOCK,
    TCP_CLIENT_E_CONNECT,
    TCP_CLIENT_E_SELECT,
    TCP_CLIENT_E_FD_ISSET,
    TCP_CLIENT_E_GET_SOCK_OPT,
    TCP_CLIENT_E_SOCK_OPT,
    TCP_CLIENT_E_TRANS,
    TCP_CLIENT_E_EOF,
};

class TcpClient {
public:
    TcpClient();
    virtual ~TcpClient();

    /**
     * @description: 创建连接
     * @param ip 服务地址
     * @param port 服务端口
     * @param msec 超时时间（毫秒）
     * @return 成功返回 TCP_CLIENT_E_OK，可调用 get_errstr 获取错误信息
     */
    int connect(const char* ip, int port, int msec);

    /**
     * @description: 重连，重连前无需调用 disconnect
     * @param msec 超时时间（毫秒）
     * @return 成功返回 TCP_CLIENT_E_OK，可调用 get_errstr 获取错误信息
     */
    int reconnect(int msec);

    /**
     * @description: 关闭连接
     * @return 
     */
    void disconnect();

    /**
     * @description: 接收数据
     * @param buf 接收缓冲区
     * @param size 缓冲区大小
     * @param msec 超时时间（毫秒）
     * @return 
     */
    int recv(char* buf, int size, int msec);

    /**
     * @description: 发送数据
     * @param buf 发送缓冲区
     * @param size 缓冲区大小
     * @param msec 超时时间（毫秒）
     * @return 
     */
    int send(const char* buf, int size, int msec);

    /**
     * @description: 获取错误信息
     * @param err 错误码
     * @return 返回错误信息
     */
    static const char* get_errstr(int err);

private:
    int sock_fd_; //socket 句柄
    struct sockaddr_in sock_addr_; //服务地址
};

#endif
